iT邦幫忙

2

[Python] vibration analysis

  • 分享至 

  • xImage
  •  

分析如震動、音頻等資訊時,時間序列的資料往往分析不出太多資訊
以下以快速傅立葉轉換(Fast Fourier Transform, FFT)
可以繪製出
* 原始資訊波形
* RMS波形
* 時頻圖
* 時頻圖(log Data)

vibra_ana(10240,df_vib.DateTime,[df_vib.X,df_vib.Y,df_vib.Z])
def vibra_ana(Fs,t,x):
    
    print('from {} to {}'.format(t[0],t[len(t)-1]))
    
    l=len(x)
    figsize = (10 * l, 20 )
    row = 5
    col = l

    plt.figure(figsize=figsize)
    
 #Determine variables
    N = np.int(np.prod(t.shape))#length of the array
    T = 1/Fs
    T = (t[1]-t[0]).microseconds*0.000001#timedelta(seconds=0.2).total_seconds()
    Fs = 1/T 	#sample rate (Hz)
    print("Fs :{} , T :{}".format(Fs,T))
    print("# Samples:",N)
 
    for index_ele , ele in enumerate(x) :
        index = 0 * l + index_ele + 1 
        
        #Plot Data
        tic = time.clock()
        plt.subplot(row,col,index)   
        plt.plot(t, ele)
        plt.xlabel('Time (seconds)')
        plt.ylabel('Accel (g)')
        plt.title('RAW Data - ' )
        plt.grid()
        toc = time.clock()
        print("Plot Time:",toc-tic)
        
        index = 1 * l + index_ele + 1 

        #Compute RMS and Plot
        tic = time.clock()
        w = np.int(np.floor(Fs/10)); #width of the window for computing RMS
        print('w :{}'.format(w))
        steps = np.int_(np.floor(N/w)) #Number of steps for RMS
        t_RMS = np.zeros((steps,1)); #Create array for RMS time values
        x_RMS = np.zeros((steps,1)); #Create array for RMS values
        for i in range (0, steps):
#             t_RMS[i] = np.mean([(t[(i*w)]-t[0]).microseconds,(t[((i+1)*w-1)]-t[0]).microseconds])
            t_RMS[i] = np.mean([(t[(i*w)]-t[0]).seconds,(t[((i+1)*w-1)]-t[0]).seconds])
    #         t_RMS[i] = np.mean(t[(i*w):((i+1)*w)]);
            x_RMS[i] = np.sqrt(np.mean(ele[(i*w):((i+1)*w)]**2));  
        plt.subplot(row,col,index)   
        plt.plot(t_RMS, x_RMS)
        plt.xlabel('Time (seconds)')
        plt.ylabel('RMS Accel (g)')
        plt.title('RMS - ' )
        plt.grid()
        toc = time.clock()
        print("RMS Time:",toc-tic)
        index = 2 * l + index_ele + 1 


        #Compute and Plot FFT
        tic = time.clock()
        plt.subplot(row,col,index)   
        xf = np.linspace(0.0, 1.0/(2.0*T), N/2)
        yf = fft(ele)
        plt.plot(xf, 2.0/N * np.abs(yf[0:np.int(N/2)]))
        plt.grid()
        plt.xlabel('Frequency (Hz)')
        plt.ylabel('Accel (g)')
        plt.title('FFT - ' )
        toc = time.clock()
        print("FFT Time:",toc-tic)
        index = 3 * l + index_ele + 1 


        
        # Compute and Plot Spectrogram
        tic = time.clock()
        plt.subplot(row,col,index)   
        f, t2, Sxx = signal.spectrogram(ele, Fs )#, nperseg = Fs/4)
        ax=plt.pcolormesh(t2, f, np.log(Sxx))
#         plt.colorbar(ax)
        plt.ylabel('Frequency [Hz]')
        plt.xlabel('Time [sec]')
        plt.title('Spectrogram(log) - ' )
        toc = time.clock()
        print("Spectrogram Time:",toc-tic)
        index = 4 * l + index_ele + 1 


    # Compute and Plot Spectrogram
        tic = time.clock()
        plt.subplot(row,col,index)   
        plt.pcolormesh(t2, f, (Sxx))
        plt.ylabel('Frequency [Hz]')
        plt.xlabel('Time [sec]')
        plt.title('Spectrogram - ' )
        toc = time.clock()
        print("Spectrogram Time:",toc-tic)

    
    plt.tight_layout()
    plt.show()

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
tyler17x
iT邦新手 5 級 ‧ 2020-04-09 20:44:36

好方法,謝謝樓主

我要留言

立即登入留言